<?php
	/*通过CURL模拟登录并获取数据
一些网站需要权限认证，必须登录网站后，才能有效地抓取网页并采集内容，
这就需要curl来设置cookie完成模拟登录网页，php的curl在抓取网页内容方
面效率是比较高的，而且支持多线程，而file_get_contents()效率就要稍低
些。模拟登录的代码如下所示：
*/
header("content-type:text/html;charset=utf-8");
function login_post($url, $cookie, $post){
    $ch = curl_init(); //初始化curl模块
    curl_setopt($ch, CURLOPT_URL, $url); //登录提交的地址
    curl_setopt($ch, CURLOPT_HEADER, 0); //是否显示头信息
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //是否自动显示返回的信息
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); //设置cookie信息保存在指定的文件夹中
    curl_setopt($ch, CURLOPT_POST, 1); //以POST方式提交
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));//要执行的信息
    $str = curl_exec($ch); //执行CURL
    curl_close($ch);
    return $str;
}
/*
上例中声明的函数login_post()，需要提供一个url地址，一个保存cookie文
件，以及post的数据（用户名和密码等信息），注意php自带的http_build_query()
函数可以将数组转换成相连接的字符串，如果通过该函数登录成功后，我们要获取
登录成功个页面信息。声明函数的代码如下所示：
*/

function get_content($url, $cookie){
    $ch = curl_init(); //初始化curl模块
    curl_setopt($ch, CURLOPT_URL, $url); //登录提交的地址
    curl_setopt($ch, CURLOPT_HEADER, 0); //是否显示头信息
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //是否自动显示返回的信息
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);//从文件中读取cookie
    $rs = curl_exec($ch); //执行curl转去页面内容
    curl_close($ch);
    return $rs; //返回字符串
}
/*
get_content()中用curlopt_cookiefile可以读取到登录保存的cookie信
息 最后讲页面内容返回.我们的目的是获取到模拟登录后的信息，也就是
只有正常登录成功后菜能获取的有用的信息，下面举例代码
*/

//通过POST方法获取页面
//$post:已经格式化过的参数
function get_content_post($url, $cookie, $post){
    $ch = curl_init(); //初始化curl模块
    curl_setopt($ch, CURLOPT_URL, $url); //登录提交的地址
    curl_setopt($ch, CURLOPT_HEADER, 0); //是否显示头信息
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //是否自动显示返回的信息
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //设置cookie信息保存在指定的文件夹中
    curl_setopt($ch, CURLOPT_POST, 1); //以POST方式提交
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);//要执行的信息
    $rs = curl_exec($ch); //执行CURL
    curl_close($ch);
    return $rs;
}

function encode($input){
    $keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    $output = "";
    $chr1=$chr2=$chr3 = "";
    $enc1=$enc2=$enc3=$enc4 = "";
    $i = 0;
    do {
        $chr1=ord($input[$i++]);
        $chr2=ord($input[$i++]);
        $chr3=ord($input[$i++]);
        $enc1=$chr1>>2;
        $enc2=(($chr1 & 3) << 4) | ($chr2 >> 4);
        $enc3 = (($chr2 & 15) << 2) | ($chr3 >> 6);
        $enc4 = $chr3 & 63;
        if($chr2==""){
            $enc3 = $enc4 = 64;
        }elseif ($chr3==""){
            $enc4 = 64;
        }
        $output=$output.$keyStr[$enc1].$keyStr[$enc2].$keyStr[$enc3].$keyStr[$enc4];
        $chr1=$chr2=$chr3 = "";
        $enc1=$enc2=$enc3=$enc4 = "";
    }while ($i<strlen($input));
return $output;
}

/*
    (废弃)从html字符串中提取课表子串
 */
function get_schedule($content){
	preg_match("/<table *?id=\"kbtable\"[\s\S]*?>[\s\S]*?<\/table>/", $content, $matches);
	return $matches[0];	
}

/*
    (废弃)用于做实验
*/
function test_showschedule()
{
	//关闭错误信息
	error_reporting(E_ALL^E_NOTICE^E_WARNING);
	$jwurl = "http://csujwc.its.csu.edu.cn/jsxsd/xk/LoginToXk";
	$kburl = "http://csujwc.its.csu.edu.cn/jsxsd/xskb/xskb_list.do?Ves632DSdyV=NEW_XSD_WDKB";
	$cookie = dirname(__FILE__).'/cookie.txt'; //设置cookie保存的路径

	$name = $_POST["name"];
	$password = $_POST["password"];	
	//编码函数有错误
	$name = encode($name);
	$password = encode($password);
	$post = array('encoded'=>$name."%%%".$password);

	login_post($jwurl, $cookie, $post); //调用模拟登录
    $content = get_content($kburl, $cookie); //登录后，调用get_content()函数获取登录后指定的页面信息
    //echo $content;
	$content = get_schedule($content);

	echo $content;
	
    @unlik($cookie); //删除cookie文件
}

?>